<?php
vendor('fpdf');

if (!defined('PARAGRAPH_STRING')) define('PARAGRAPH_STRING', '~~~');

class FpdfHelper extends FPDF {
	var $title;
	var $helpers = array();
	/**
	 * Allows you to change the defaults set in the FPDF constructor
	 *
	 * @param string $orientation page orientation values: P, Portrait, L, or Landscape    (default is P)
	 * @param string $unit values: pt (point 1/72 of an inch), mm, cm, in. Default is mm
	 * @param string $format values: A3, A4, A5, Letter, Legal or a two element array with the width and height in unit given in $unit
	 */
	function setup ($orientation='P',$unit='mm',$format='A4') {
		$this->FPDF($orientation, $unit, $format);
	}

	/**
	 * Allows you to control how the pdf is returned to the user, most of the time in CakePHP you probably want the string
	 *
	 * @param string $name name of the file.
	 * @param string $destination where to send the document values: I, D, F, S
	 * @return string if the $destination is S
	 */
	function fpdfOutput ($name = 'page.pdf', $destination = 'D') {
		// I: send the file inline to the browser. The plug-in is used if available.
		//    The name given by name is used when one selects the "Save as" option on the link generating the PDF.
		// D: send to the browser and force a file download with the name given by name.
		// F: save to a local file with the name given by name.
		// S: return the document as a string. name is ignored.
		return $this->Output($name, $destination);
	}

	function Header()
	{
		//Logo
		$this->Image(WWW_ROOT.'logo.jpg',10,0);
		// you can use jpeg or pngs see the manual for fpdf for more info
		//Arial bold 15
		$this->SetFont('Arial','B',15);
		//Move to the right
		$this->Ln(20);
		$this->Ln(20);
		$this->Cell(80);
		//Title
		$this->Cell(30,10,$this->title,0,0,'C');
		//Line break
		$this->Ln(20);
	}

	//Page footer
	function Footer()
	{
		//Position at 1.5 cm from bottom
		$this->SetY(-15);
		//Arial italic 8
		$this->SetFont('Arial','I',8);
		//Page number
		$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
	}

	function hex2dec($couleur = "#000000"){
		$R = substr($couleur, 1, 2);
		$rouge = hexdec($R);
		$V = substr($couleur, 3, 2);
		$vert = hexdec($V);
		$B = substr($couleur, 5, 2);
		$bleu = hexdec($B);
		$tbl_couleur = array();
		$tbl_couleur['R']=$rouge;
		$tbl_couleur['G']=$vert;
		$tbl_couleur['B']=$bleu;
		return $tbl_couleur;
	}

	function px2mm($px){
		return $px*25.4/72;
	}

	function txtentities($html){
		$trans = get_html_translation_table(HTML_ENTITIES);
		$trans = array_flip($trans);
		return strtr($html, $trans);
	}
	
		var $B;
		var $I;
		var $U;
		var $HREF;
		var $fontList;
		var $issetfont;
		var $issetcolor;

		function FpdfHelper($orientation='P',$unit='mm',$format='A4')
		{
			//Call parent constructor
			$this->FPDF($orientation,$unit,$format);
			//Initialization
			$this->B=0;
			$this->I=0;
			$this->U=0;
			$this->HREF='';

			$this->tableborder=0;
			$this->tdbegin=false;
			$this->tdwidth=0;
			$this->tdheight=0;
			$this->tdalign="L";
			$this->tdbgcolor=false;

			$this->oldx=0;
			$this->oldy=0;

			$this->fontlist=array("arial","times","courier","helvetica","symbol");
			$this->issetfont=false;
			$this->issetcolor=false;
		}

		//////////////////////////////////////
		//html parser

		function WriteHTML($html)
		{
			$html=strip_tags($html,"<b><u><i><a><img><p><br><strong><em><font><tr><blockquote><hr><td><tr><table><sup>"); //remove all unsupported tags
			$html=str_replace("\n",'',$html); //replace carriage returns by spaces
			$html=str_replace("\t",'',$html); //replace carriage returns by spaces
			$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); //explodes the string
			foreach($a as $i=>$e)
			{
				if($i%2==0)
				{
					//Text
					if($this->HREF)
					$this->PutLink($this->HREF,$e);
					elseif($this->tdbegin) {
						if(trim($e)!='' and $e!="&nbsp;") {
							$this->Cell($this->tdwidth,$this->tdheight,$e,$this->tableborder,'',$this->tdalign,$this->tdbgcolor);
						}
						elseif($e=="&nbsp;") {
							$this->Cell($this->tdwidth,$this->tdheight,'',$this->tableborder,'',$this->tdalign,$this->tdbgcolor);
						}
					}
					else
					$this->Write(5,stripslashes($this->txtentities($e)));
				}
				else
				{
					//Tag
					if($e{0}=='/')
					$this->CloseTag(strtoupper(substr($e,1)));
					else
					{
						//Extract attributes
						$a2=explode(' ',$e);
						$tag=strtoupper(array_shift($a2));
						$attr=array();
						foreach($a2 as $v)
						if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
						$attr[strtoupper($a3[1])]=$a3[2];
						$this->OpenTag($tag,$attr);
					}
				}
			}
		}

		function OpenTag($tag,$attr)
		{
			//Opening tag
			switch($tag){

				case 'SUP':
					if($attr['SUP'] != '') {
						//Set current font to: Bold, 6pt
						$this->SetFont('','',6);
						//Start 125cm plus width of cell to the right of left margin
						//Superscript "1"
						$this->Cell(2,2,$attr['SUP'],0,0,'L');
					}
					break;

				case 'TABLE': // TABLE-BEGIN
					if( isset($attr['BORDER']) ) $this->tableborder=$attr['BORDER'];
					else $this->tableborder=0;
					break;
				case 'TR': //TR-BEGIN
					break;
				case 'TD': // TD-BEGIN
					if( isset($attr['WIDTH']) ) $this->tdwidth=($attr['WIDTH']/4);
					else $this->tdwidth=40; // SET to your own width if you need bigger fixed cells
					if( isset($attr['HEIGHT'])) $this->tdheight=($attr['HEIGHT']/6);
					else $this->tdheight=6; // SET to your own height if you need bigger fixed cells
					if( isset($attr['ALIGN']) ) {
						$align=$attr['ALIGN'];
						if($align=="LEFT") $this->tdalign="L";
						if($align=="CENTER") $this->tdalign="C";
						if($align=="RIGHT") $this->tdalign="R";
					}
					else $this->tdalign="L"; // SET to your own
					if( isset($attr['BGCOLOR'])) {
						$coul=$this->hex2dec($attr['BGCOLOR']);
						$this->SetFillColor($coul['R'],$coul['G'],$coul['B']);
						$this->tdbgcolor=true;
					}
					$this->tdbegin=true;
					break;

				case 'HR':
					if( $attr['WIDTH'] != '' )
					$Width = $attr['WIDTH'];
					else
					$Width = $this->w - $this->lMargin-$this->rMargin;
					$x = $this->GetX();
					$y = $this->GetY();
					$this->SetLineWidth(0.2);
					$this->Line($x,$y,$x+$Width,$y);
					$this->SetLineWidth(0.2);
					$this->Ln(1);
					break;
				case 'STRONG':
					$this->SetStyle('B',true);
					break;
				case 'EM':
					$this->SetStyle('I',true);
					break;
				case 'B':
				case 'I':
				case 'U':
					$this->SetStyle($tag,true);
					break;
				case 'A':
					$this->HREF=$attr['HREF'];
					break;
				case 'IMG':
					if(isset($attr['SRC']) and (isset($attr['WIDTH']) or isset($attr['HEIGHT']))) {
						if(!isset($attr['WIDTH']))
						$attr['WIDTH'] = 0;
						if(!isset($attr['HEIGHT']))
						$attr['HEIGHT'] = 0;
						$this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
					}
					break;
					//case 'TR':
				case 'BLOCKQUOTE':
				case 'BR':
					$this->Ln(5);
					break;
				case 'P':
					$this->Ln(10);
					break;
				case 'FONT':
					if (isset($attr['COLOR']) and $attr['COLOR']!='') {
						$coul=hex2dec($attr['COLOR']);
						$this->SetTextColor($coul['R'],$coul['G'],$coul['B']);
						$this->issetcolor=true;
					}
					if (isset($attr['FACE']) and in_array(strtolower($attr['FACE']), $this->fontlist)) {
						$this->SetFont(strtolower($attr['FACE']));
						$this->issetfont=true;
					}
					if (isset($attr['FACE']) and in_array(strtolower($attr['FACE']), $this->fontlist) and isset($attr['SIZE']) and $attr['SIZE']!='') {
						$this->SetFont(strtolower($attr['FACE']),'',$attr['SIZE']);
						$this->issetfont=true;
					}
					break;
			}
		}

		function CloseTag($tag)
		{
			//Closing tag
			if($tag=='SUP') {
			}

			if($tag=='TD') { // TD-END
				$this->tdbegin=false;
				$this->tdwidth=0;
				$this->tdheight=0;
				$this->tdalign="L";
				$this->tdbgcolor=false;
			}
			if($tag=='TR') { // TR-END
				$this->Ln();
			}
			if($tag=='TABLE') { // TABLE-END
				//$this->Ln();
				$this->tableborder=0;
			}

			if($tag=='STRONG')
			$tag='B';
			if($tag=='EM')
			$tag='I';
			if($tag=='B' or $tag=='I' or $tag=='U')
			$this->SetStyle($tag,false);
			if($tag=='A')
			$this->HREF='';
			if($tag=='FONT'){
				if ($this->issetcolor==true) {
					$this->SetTextColor(0);
				}
				if ($this->issetfont) {
					$this->SetFont('arial');
					$this->issetfont=false;
				}
			}
		}

		function SetStyle($tag,$enable)
		{
			//Modify style and select corresponding font
			$this->$tag+=($enable ? 1 : -1);
			$style='';
			foreach(array('B','I','U') as $s)
			if($this->$s>0)
			$style.=$s;
			$this->SetFont('',$style);
		}

		function PutLink($URL,$txt)
		{
			//Put a hyperlink
			$this->SetTextColor(0,0,255);
			$this->SetStyle('U',true);
			$this->Write(5,$txt,$URL);
			$this->SetStyle('U',false);
			$this->SetTextColor(0);
		}
	}
	?>